home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / dskut / fdform18.zip / WIMAGE.PAS < prev   
Pascal/Delphi Source File  |  1991-07-21  |  6KB  |  218 lines

  1. {$A+,B-,D+,E-,F-,I-,L+,N-,O-,R-,S-,V-}
  2. {$M 4096,0,655360}
  3. PROGRAM WIMAGE;
  4.  
  5.   {WIMAGE - Write Diskette to file / Read Diskette from file - Ver 1.21}
  6.   {Compiled with Turbo-Pascal Ver 6.0}
  7.  
  8. USES auxdos,dos,diskio;
  9.  
  10. VAR para   : String[50];
  11.   fn       : String[50];
  12.   f        : FILE;
  13.   lw       : Byte;
  14.   ok       : Boolean;
  15.   trk      : Word;
  16.   rest     : Word;
  17.   t,rt     : Word;
  18.   j        : Word;
  19.   written  : Word;
  20.   xsec     : LongInt;
  21.   readdisk : Boolean;
  22.   FileBoot : ^bpbtyp;
  23.   ysec     : LongInt;
  24.   ftrk     : Word;
  25.   CylMem   : CmTyp;
  26.  
  27.   PROCEDURE SyntaxError;
  28.   BEGIN
  29.     InOutRes:=0;
  30.     WriteLn(stderr,'Syntax Error.');
  31.     WriteLn(stderr);
  32.     WriteLn(stderr,'Syntax is:   WIMAGE <drive>: <file>  (write Diskette to file)');
  33.     WriteLn(stderr,'             WIMAGE <file> <drive>:  (read Diskette from file)');
  34.     WriteLn(stderr);
  35.     WriteLn(stderr,'Exapmles: WIMAGE A: C:\DISKS\MYDISK.360');
  36.     WriteLn(stderr,'          WIMAGE C:\DISKS\DOS330.144 A:');
  37.     WriteLn(stderr);
  38.     Halt(1);
  39.   END;
  40.  
  41.   PROCEDURE BootError;
  42.   BEGIN
  43.     InOutRes:=0;
  44.     WriteLn(stderr,'File ',fn,' is no diskette image.');
  45.     Halt(9);
  46.   END;
  47.  
  48.   PROCEDURE DosError;
  49.   BEGIN
  50.     InOutRes:=0;
  51.     WriteLn(stderr,'This program requires DOS 3.20 or higher.');
  52.     Halt(10);
  53.   END;
  54.  
  55.   PROCEDURE CloseExitProc;
  56.   BEGIN
  57.     Close(f);
  58.     IF readdisk THEN Erase(f);
  59.     DefExitProc;
  60.   END;
  61.  
  62. BEGIN
  63.   SetIntVec($1B,@CtrlBreak);
  64.   WriteLn;
  65.   WriteLn('WIMAGE-Write Disk to File/Read Disk from File-V1.21');
  66.   WriteLn('Copyright (c) 1988 - 1991, Christoph H. Hochstätter');
  67.   WriteLn;
  68.   IF Swap(DosVersion)<$314 THEN DosError;
  69.   IF (Length(ParamStr(1))=2) AND (Length(ParamStr(2))=2) THEN SyntaxError;
  70.   IF Length(ParamStr(1))=2 THEN BEGIN
  71.     para:=ParamStr(1);
  72.     fn:=ParamStr(2);
  73.     readdisk:=True;
  74.   END ELSE IF Length(ParamStr(2))=2 THEN BEGIN
  75.     para:=ParamStr(2);
  76.     fn:=ParamStr(1);
  77.     readdisk:=False;
  78.   END ELSE
  79.     SyntaxError;
  80.   IF fn='' THEN SyntaxError;
  81.   FOR lw:=1 TO Length(fn) DO fn[lw]:=Upcase(fn[lw]);
  82.   IF para[2]<>':' THEN SyntaxError;
  83.   lw:=Ord(Upcase(para[1]))-$40;
  84.   BootSec.init(ok);
  85.   IF NOT(ok) THEN BEGIN
  86.     WriteLn(stderr,'Not enough Memory.');
  87.     Halt(4);
  88.   END;
  89.   BootSec.Readx(lw);
  90.   IF BootSec.UnknownDrive THEN BEGIN
  91.     WriteLn(stderr,'Drive does not exist.');
  92.     Halt(3);
  93.   END;
  94.   IF (BootSec.Status AND $9200) <> 0 THEN BEGIN
  95.     WriteLn(stderr,'WIMAGE does not work with a SUBST/ASSIGN/NETWORK Drive.');
  96.     Halt(2);
  97.   END;
  98.   IF BootSec.Media=5 THEN BEGIN
  99.     WriteLn(stderr,'WIMAGE does not handle fixed disks.');
  100.     Halt(8);
  101.   END;
  102.   WITH BootSec.bpb^ DO BEGIN
  103.     IF sec<>0 THEN
  104.       xsec:=sec
  105.     ELSE
  106.       xsec:=lsc;
  107.     rest:=xsec MOD (hds*spt);
  108.     IF rest<>0 THEN BEGIN
  109.       WriteLn(stderr,'This disk has hidden sectors.');
  110.       Halt(5);
  111.     END;
  112.     trk:=xsec DIV (hds*spt);
  113.     WriteLn('Information from the floppy:');
  114.     WriteLn('Tracks       : ',trk);
  115.     WriteLn('Sectors/Track: ',spt);
  116.     WriteLn('Sides        : ',hds);
  117.     IF readdisk THEN BEGIN
  118.       WriteLn('Bytes total  : ',DiskSize(lw));
  119.       WriteLn('Bytes free   : ',DiskFree(lw));
  120.     END ELSE ysec:=DiskSize(lw);
  121.     WriteLn;
  122.     Assign(f,fn);
  123.     IF readdisk THEN BEGIN
  124.       FileMode:=OWriteOnly OR ODenyWrite;
  125.       Rewrite(f,1);
  126.       Reset(f,1);
  127.     END ELSE BEGIN
  128.       FileMode:=OReadOnly OR ODenyWrite;
  129.       Reset(f,1);
  130.     END;
  131.     IF IoResult<>0 THEN BEGIN
  132.       WriteLn(stderr,'File ',fn,' cannot be openend.');
  133.       Halt(6);
  134.     END;
  135.     ExitProc:=@CloseExitProc;
  136.     IF NOT(readdisk) THEN BEGIN
  137.       GetMem(FileBoot,512);
  138.       BlockRead(f,FileBoot^,512,written);
  139.       IF (written<>512) OR
  140.       (FileBoot^.boot_code[511]<>$AA) OR
  141.       (FileBoot^.boot_code[510]<>$55) THEN BEGIN
  142.         BootError;
  143.       END;
  144.       IF FileBoot^.sec=0 THEN
  145.         ysec:=FileBoot^.lsc
  146.       ELSE
  147.         ysec:=FileBoot^.sec;
  148.       ftrk:=ysec DIV (FileBoot^.spt*FileBoot^.hds);
  149.       WriteLn('Information from the Image-File');
  150.       WriteLn('Tracks       : ',ftrk);
  151.       WriteLn('Sectors/Track: ',FileBoot^.spt);
  152.       WriteLn('Sides        : ',FileBoot^.hds);
  153.       WriteLn;
  154.       IF (ftrk<>trk) OR (FileBoot^.spt<>spt) OR (FileBoot^.hds<>hds) THEN BEGIN
  155.         InOutRes:=0;
  156.         WriteLn(stderr,'Source File and Destination Disk have different formats.');
  157.         Halt(11);
  158.       END;
  159.       Seek(f,0);
  160.       FreeMem(FileBoot,512);
  161.     END;
  162.     maxcyl:=AllocCyl(CylMem,trk-1);
  163.     WriteLn(Succ(maxcyl)*LongInt(CylMem^[0]^.Datalen),' Bytes available for ',maxcyl+1,' Cylinders.');
  164.     WriteLn;
  165.     t:=0;
  166.     IF readdisk THEN BEGIN
  167.       WHILE t<trk DO BEGIN
  168.         InOutRes:=0;
  169.         EndProgram(128,'User abort.');
  170.         IF t+maxcyl>trk-1 THEN rt:=trk-t ELSE rt:=maxcyl+1;
  171.         Write('Reading',rt:3,' Cylinders from',t:3,' to',t+rt-1:3,' ');
  172.         FOR j:=0 TO rt-1 DO BEGIN
  173.           InOutRes:=0;
  174.           EndProgram(128,'User abort. Partial file '+fn+' erased.');
  175.           CylMem^[j]^.Readx(lw,t+j);
  176.         END;
  177.         WriteLn('- Writing to File ',fn);
  178.         FOR j:=0 TO rt-1 DO BEGIN
  179.           BlockWrite(f,CylMem^[j]^.data^,CylMem^[j]^.Datalen,written);
  180.           IF IoResult<>0 THEN BEGIN
  181.             WriteLn(stderr,'Error writing to file ',fn);
  182.             Halt(13);
  183.           END;
  184.           IF written<>CylMem^[j]^.Datalen THEN BEGIN
  185.             InOutRes:=0;
  186.             WriteLn(stderr,'Disk Full - File: ',fn);
  187.             Halt(7);
  188.           END;
  189.         END;
  190.         t:=t+rt;
  191.       END;
  192.     END ELSE BEGIN
  193.       WHILE t<trk DO BEGIN
  194.         EndProgram(128,'User abort.');
  195.         IF t+maxcyl>trk-1 THEN rt:=trk-t ELSE rt:=maxcyl+1;
  196.         Write('Reading from file ',fn,' ');
  197.         FOR j:=0 TO rt-1 DO BEGIN
  198.           BlockRead(f,CylMem^[j]^.data^,CylMem^[j]^.Datalen,written);
  199.           IF (written<>CylMem^[j]^.Datalen) OR (IoResult<>0) THEN BEGIN
  200.             WriteLn(stderr,'Error reading from File ',fn);
  201.             Halt(12);
  202.           END;
  203.         END;
  204.         WriteLn('- Writing',rt:3,' Cylinders from',t:3,' to',t+rt-1:3);
  205.         FOR j:=0 TO rt-1 DO BEGIN
  206.           InOutRes:=0;
  207.           EndProgram(128,'User abort.');
  208.           CylMem^[j]^.Writex(lw,t+j);
  209.         END;
  210.         t:=t+rt;
  211.       END;
  212.       BootSec.Remount(lw);
  213.     END;
  214.     Close(f);
  215.     ExitProc:=@DefExitProc;
  216.   END;
  217. END.
  218.